package com.welike.shibo.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.welike.shibo.eneity.JsonResult;
import com.welike.shibo.eneity.Video;
import com.welike.shibo.vo.VideoInfoListVO;
import com.welike.shibo.vo.page.FollowVideoPageVo;
import com.welike.shibo.vo.page.VideoPageVo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.List;

/**
 * Created by fangyu on 2019-08-18.
 */
public interface VideoService extends IService<Video> {

    /**
     * 通过vid查询封面图
     * @param vid 视频id
     * @return cover
     */
    String queryCoverByVid(String vid);

    /**
     * 通过vid查询简介
     * @param vid 视频id
     * @return desc
     */
    String queryDescByVid(String vid);

    /**
     * 查询指定用户的视频列表
     * @param page 当前页码
     * @param pageSize 页大小
     * @param uid 指定的人
     * @param login_uid 登录用户的uid，如果为空则不管
     * @return 关注的人视频列表
     */
    List<VideoPageVo> selectUserPage(int page, int pageSize, String uid, String login_uid);

    /**
     * 分页查询首页的视频信息列表
     * @param page 当前页码
     * @param pageSize 页大小
     * @param userId 用户id
     * @return 分页的首页信息
     */
    IPage<VideoPageVo> selectIndexPage(int page, int pageSize, String userId);

    /**
     * 处理首页关注点赞逻辑
     * @param page 当前页码
     * @param pageSize 页大小
     * @param uid 用户id
     * @return 首页分页的加上首页点赞关注信息
     */
    List<VideoPageVo> queryIndexPage(int page, int pageSize, String uid);

    /**
     * 查询关注的人的视频列表
     * @param page 当前页码
     * @param pageSize 页大小
     * @param uidList 关注的人uid列表
     * @return 关注的人视频列表
     */
    IPage<VideoPageVo> selectFollowPage(int page, int pageSize, List<String> uidList);


    /**
     * TODO 重做查询关注的人的视频列表
     * @param page 页码
     * @param pageSize 分页大小
     * @param uidList 关注的人uid列表
     * @return List<FollowVideoPageVo>
     */
    List<FollowVideoPageVo> getFollowVideoPageVoList(int page, int pageSize, String uid, List<String> uidList);

    /**
     * 查询视频赞的次数
     * @param vid 视频id
     * @return int
     */
    Integer queryLikeCountsById(String vid);

    /**
     * 查询视频被分享的次数
     * @param vid 视频id
     * @return int
     */
    Integer queryShareCountsById(String vid);

    /**
     * 查询用户(userId)发布了多少个视频
     * @param uid 用户id
     * @return Integer
     */
    Integer countByUserId(String uid);

    /**
     * 查询用户(userId)收获了多个赞(视频)
     * @param uid 用户id
     * @return Integer
     */
    Integer sumForLikeCountsByUserId(String uid);

    /**
     * 上传视频功能
     * @param file 文件
     * @return String
     * @throws IOException IO异常
     */
    String uploadFile(MultipartFile file) throws IOException;

    // 发布视频功能(新增)


    /**
     * 统计所有发布的视频数量
     * @return Integer
     */
    Integer countByVideo();

    /**
     * 后台视频管理分页
     * @param page 分页
     * @return IPage
     */
    IPage<VideoInfoListVO> selectVideoPageVo(Page<VideoInfoListVO> page);

    /**
     * 频道 => 全部
     * @param page
     * @param pageSize
     * @return
     */
    IPage<VideoPageVo> getAllVideoPageVo(int page, int pageSize);

    // 频道 => 同城
    IPage<VideoPageVo> getCityVideoPageVo(int page, int pageSize, String city);

    // 频道 => 大V
    IPage<VideoPageVo> getVipVideoPageVo(int page, int pageSize);

    // 频道 => 推荐
    IPage<VideoPageVo> getHotVideoPageVo(int page, int pageSize);

    // 通过视频id查询作者id
    String queryUserIdById(String vid);


    /**
     * 更新视频状态
     * @param id 视频id
     * @param status 视频修改状态
     */
    void updateVideoStatus(String id, Integer status);


    /**
     * 用户根据关键词搜索视频
     * @param page
     * @param pageSize
     * @param key
     * @return
     */
    List<FollowVideoPageVo> searchVideo(int page, int pageSize, String key);

    /**
     * 通过uid查询发布的所有的作品id
     * @param uid
     * @return 列表
     */
    List<String> findVideoIdByUid(String uid);


    /**
     * 通过vid查询作品url
     * @param vid 视频id
     * @return url
     */
    String queryVideoUrlByVid(String vid);

    /**
     * 封装查询数据加上关注和点赞状态(更新表) ==>加上商品信息(更新表)
     * @param page 分页
     * @param pageSize 容量
     * @param uid 用户id
     * @param list 列表
     * @return 列表
     */
    List<VideoPageVo> queryFollowAndLikeState(int page, int pageSize, String uid, List<VideoPageVo> list);

    /**
     * 删除视频及关联信息
     * @param id 视频id
     * @return JsonResult
     */
    JsonResult removeVideo(String id);

    JsonResult create(JSONObject requestJson, HttpServletRequest request) throws UnknownHostException;

//    String compound(MultipartFile file, String desc, String audioId, Integer duration, Integer width, Integer height, MultipartFile cover, String path,  String shopId);

    /**
     * 视频音乐合成
     * @param file 文件
     * @param audioId 音频id
     * @param duration 时长
     * @return 合成文件名
     */
    String compound(MultipartFile file, String audioId, Integer duration);


    /**
     * 图片剪辑
     * @param file 文件
     * @param name 生成名字
     * @return Boolean
     */
    Boolean screenshot(MultipartFile file, String name);

}
